package com.qing.seckill.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

import java.util.concurrent.ThreadPoolExecutor;

@Component
@Configuration
public class RedisConfig {

	/**
	 * 线程池配置
	 *
	 * @return
	 */
	@Bean
	public ThreadPoolTaskExecutor executor() {
		ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
		//核心线程数，默认为1
		executor.setCorePoolSize(10);
		//最大线程数，默认为Integer.MAX_VALUE
		executor.setMaxPoolSize(50);
		//队列最大长度，一般需要设置值>=notifyScheduledMainExecutor.maxNum；默认为Integer.MAX_VALUE
		executor.setQueueCapacity(10000);
		//线程池维护线程所允许的空闲时间，默认为60s
		executor.setKeepAliveSeconds(300);
		//线程池对拒绝任务（无线程可用）的处理策略，目前只支持AbortPolicy、CallerRunsPolicy；默认为后者
		/**
		 * 线程池对拒绝任务的处理策略：
		 * CallerRunsPolicy ：
		 * 这个策略重试添加当前的任务，他会自动重复调用 execute() 方法，直到成功。
		 * AbortPolicy ：
		 * 对拒绝任务抛弃处理，并且抛出异常。
		 * DiscardPolicy ：
		 * 对拒绝任务直接无声抛弃，没有异常信息。
		 * DiscardOldestPolicy ：
		 * 对拒绝任务不抛弃，而是抛弃队列里面等待最久的一个线程，然后把拒绝任务加到队列。
		 */
		executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

		return executor;
	}
}
